import java.util.ArrayList;
import java.util.Iterator;
import java.util.HashMap;


public class Bestellung {
	
	private ArrayList<Position> positionen;
	
	private class Position{
		
		private int anzahl;
		private Form form;
		private Teig teig;
		private Fuellung fuellung;
		//fuellung, form, teig != null
		
		//initialisert eine neue Position mit den spezifizierten Parametern
		private Position(int anzahl, Form form, Teig teig){
			
			this.anzahl = anzahl;
			this.form = form;
			this.teig = teig;
			
		}
		//initialisert eine neue Position mit den spezifizierten Parametern
		private Position(int anzahl, Form form, Teig teig, Fuellung fuellung){
			
			this.anzahl = anzahl;
			this.form = form;
			this.teig = teig;
			this.fuellung = fuellung;
			
		}
		
	}
	
	//initialisiert eine neue Bestellung
	public Bestellung(){
		
		positionen = new ArrayList<Position>();
		
	}
	
	//fuegt eine neue Position zu der aktuellen Bestellung hinzu
	public void addPosition(int anzahl, Form form, Teig teig){
		
		positionen.add(new Position(anzahl, form, teig));
		
	}
	
	//fuegt eine neue Position zu der aktuellen Bestellung hinzu
	public void addPosition(int anzahl, Form form, Teig teig, Fuellung fuellung){
		
		positionen.add(new Position(anzahl, form, teig, fuellung));
		
	}
	
	//gibt eine Keksdose zurueck, die die gebackenen Kekse der aktuellen Bestellung enthaelt
	public Keksdose durchfuehren(){
		
		Keksdose k = new Keksdose();
		HashMap<Form, AbstrakteKeksbackmaschine> keksebacken = new HashMap<Form, AbstrakteKeksbackmaschine>();
		
		keksebacken.put(Form.Weihnachtsmannform, new WeihnachtsmannKeksbackmaschine());
		keksebacken.put(Form.Rundform, new RunderKeksbackmaschine());
		keksebacken.put(Form.Mondform, new MondKeksbackmaschine());
		
		Iterator<Position> it = positionen.iterator();
		while(it.hasNext()){
			
			Position p = it.next();
			
			AbstrakteKeksbackmaschine bm = keksebacken.get(p.form);
			bm.backekekse(p.teig, p.anzahl);
			
			if(p.fuellung != null){
				
				DoppelkeksMaschine dbm = new DoppelkeksMaschine();
				ArrayList<EinfacherKeks> einzelkekse = bm.getPosition();
				ArrayList<Doppelkeks> doppelkekse = new ArrayList<Doppelkeks>();
				
				for(int i = 0; i < einzelkekse.size(); i++){

					Doppelkeks dk =  dbm.erstelleDoppelkeks(einzelkekse.get(i), p.fuellung);
					doppelkekse.add(dk);
					
				}
				
				k.inKeksdoselegen(doppelkekse);
				
			}else{
			
				k.inKeksdoselegen(bm.getPosition());
				
			}
			
		}
		
		return k;
		
	}
	
	//gibt alle Positionen der Bestellung in der Standardausgabe aus
	public void drucke(){
		
		Iterator<Position> it = positionen.iterator();
		int count = 0;
		
		while(it.hasNext()){
			
			count++;
			Position position = it.next();
			
			String out = "Position " + count + ": " + position.anzahl;
			
			if(position.fuellung != null) out += " Doppelkekse mit " + position.fuellung;
			else out += " Kekse";
			
			out += " aus " + position.teig;
			
			System.out.println(out);
			
		}
		
	}

}
